第3章 虚拟化概述
虚拟机可以看作物理机的一种高效隔离的复制,三个典型特征是:同质、高效和资源受控。
大多数现代计算机体系结构都有两个或两个以上的特权级,系统中有一些操作和管理关键系统资源的指令会被定位特权指令。在虚拟化世界里,还有一类指令被称为敏感指令,即操作特权资源的指令。
所有的特权指令都是敏感指令,但是并不是所有的敏感指令都是特权指令。
敏感指令必须在VMM的监控审查下进行,或者经由VMM来完成。
如果一个系统上所有敏感指令都是特权指令,则能够用一个很简单的方法来实现一个虚拟环境:将VMM运行在系统的最高特权级上,而将客户机操作系统运行在非最高特权级上,当客户机操作系统因执行敏感指令(此时,也就是特权指令)而陷人到VMM时,VMM模拟执行引起异常的敏感指令,这种方法被称为“陷入再模拟”。
总而言之,判断一个结构是否可虚拟化,其核心就在于该结构对敏感指令的支持上。如果在某些结构上所有敏感指令都是特权指令,则它是可虚拟化的结构;否则,如果它无法支持在所有的敏感指令上触发异常,则不是一个可虚拟化的结构,我们称其存在“虚拟化漏洞”。
陷入再模拟
VMM陷入是利用了处理器的保护机制,利用中断和异常来完成的:
- 基于处理器保护机制触发的异常,例如前面提到的敏感指令的执行。处理器会在执行敏感指令之前,检查其执行条件是否满足,例如当前特权级别、运行模式以及内存映射关系等。一旦任一条件不满足,VMM得到陷入然后进行处理。
- 虚拟机主动触发异常,即陷阱。当条件满足时,处理器会在触发陷阱的指令执行完毕后,再抛出一个异常。虚拟机可以通过陷阱指令来主动请求陷入到VMM中去。例如后面介绍的类虚拟化技术就是通过这种方式实现Hypercall的
- 异步中断,包括处理器内部的中断源和外部的设备中断源。这些中断源可以是周期性产生中断的时间源,也可以是根据设备状态产生中断的大多数外设。一旦中断信号到达处理器,处理器会强行中断当前指令,然后跳到VMM注册的终端服务程序。例如,VMM可以通过调度算法指定当前虚拟机运行的时间片长度,然后编程外部时钟源,确保时间片用完时触发中断,从而允许VMM进行下一次调度。
内存虚拟化
内存虚拟化需要解决两个问题:
- 给定一个虚拟机,维护客户机物理地址到宿主机物理地址之间的映射关系。
- 截获虚拟机对客户机物理地址的访问,并根据所记录的映射关系,将其转换成宿主机物理地址。
内存虚拟化还实现了整个系统的安全隔离,包括虚拟机与虚拟机之间以及虚拟机与 VMM之间。
- VMM硬件功能使得客户机操作系统运行在完全不同的地址空间里,或者通过段限制客户机操作系统所能看见的空间大小,以保证VMM自身的安全性,从而防止虚拟机触及VMM自身的运行状态。
- VMM通过特殊的权限验证机制使得客户机操作系统局限在给定的地址空间里,以保证一个虚拟机只能访问分配给它的内存页,从而避免因存在设计上的漏洞让某个虚拟机可以访问其它虚拟机的信息或者恶意破坏其它虚拟机的运行环境。
- VMM能通过一些硬件技术,防止虚拟机利用设备可以通过DMA的方式绕过处理器而直接访问目标内存的特点,恶意访问设备的DMA目标寄存器,从而通过设备越权访问所有物理地址。